#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

// 定义子进程处理文件时的错误状态码
#define ST_NOEXISTS 1   /* 文件不存在 */
#define ST_NOTISFILE 2   /* 不是一个文件 */

// 读取一行数据： 基于系统调用 sys call
int readline(int fd, char *buf){
    char c = 0;  // EOF
    int idx = 0;  // 字符下标
    while(1){
        read(fd, &c, 1);
        if(c == EOF || c == '\n') break;
        buf[idx++] = c;
    }

    return idx; // 读取的数据长度
}

// ./t2 文件名
int main(int argc, char const *argv[])
{
    if(argc != 2) return -1;

    if(fork() == 0){
        int fd = open(argv[1], O_RDONLY);
        if(fd < 2) {
            _exit(ST_NOEXISTS);
        }

        char line[1024] = "";
        while(readline(fd, line)){
            if(strstr(line, "disen") != NULL) printf("%s\n", line);
            bzero(line, 1024);
        }
        close(fd);
        _exit(0);
    }

    // 等待回收子进程
    int status = 0;
    wait(&status);
    if(WIFEXITED(status)){
        switch (WEXITSTATUS(status))
        {
        case 0:
            printf("OK\n");
            break;
        case ST_NOEXISTS:
            printf("%s 文件不存在!\n", argv[1]);
            break;
        default:
            printf("FAIL\n");
            break;
        }
    }
    return 0;
}
